from ast import And
from asyncio.windows_events import NULL
from PIL import Image
import os

file_path = "./images" #要处理的图片文件夹路径
outfile_path = "./res" #输出的位置
#可以处理的文件格式
# gif不可处理，如果要处理gif 详见https://blog.csdn.net/huanyue6660/article/details/79423326
img_suffix = ['.png','.jpg','.jpeg']
max_wight = 412 #图片最宽
max_height = 732 #图片最高
do_quality = 85 #压缩质量 90质量最高 85效果最好 75图片比较清晰

# 获取图片文件的大小
def get_size(file):
    # 获取文件大小:KB
    size = os.path.getsize(file)
    return size / 1024

# 检查文件夹路径是否存在，不存在则创建
def check_path(path):
    if not os.path.exists(path):
        os.makedirs(path)


# 拼接输出文件地址
def get_outfile(infile, outpath):
    dir, suffix = os.path.splitext(infile) # 获取文件的路径和后缀

    # 如果设置了输出路径则使用设置的路径
    if outpath:
        dir, file = os.path.split(infile) # 获取文件的路径和文件名
        parentdir = str.split(dir,file_path)[1]

        #检查文件夹是否存在
        check_path('{}{}'.format(outpath, parentdir))

        #拼接
        outfile = '{}{}/{}'.format(outpath, parentdir, file)
        return outfile, suffix

    # 拼接路径
    #outfile = '{}-out{}'.format(dir, suffix) #新建
    outfile = '{}{}'.format(dir, suffix) #覆盖
    return outfile, suffix


# 压缩图片
def compress_image(infile, outpath='', mb=200, quality=85):
    """
    :param infile: 压缩源文件
    :param outpath: 压缩文件保存地址
    :param mb: 跳过小于该值的文件
    :param quality: 初始压缩比率
    :return
    """
    src_size = get_size(infile)
    
    if src_size <= mb:
        return infile

    # 获取输出地址和后缀
    outfile,suffix = get_outfile(infile, outpath)

    if not suffix or suffix not in img_suffix:
        print('不处理的文件：'+ infile)
        return

    #压缩
    im = Image.open(infile)
    w,h = im.size
    # 重置图片尺寸
    while w>max_wight or h>max_height:
        w,h = round(w*0.9),round(h*0.9)#去掉浮点，防报错    
    im = im.resize((w,h), Image.ANTIALIAS)
    
    # im.save(outfile, quality=quality)#不能处理带透明度的图片
    im.convert('RGB').save(outfile, optimize=True, quality=quality)#可以处理带透明度的图片
    return


# 获取文件夹下所有文件
def listdir(path, list_name):  #传入存储的list
    for file in os.listdir(path):
        file_path = os.path.join(path, file)  
        if os.path.isdir(file_path):
            listdir(file_path, list_name)  
        else:
            list_name.append(file_path)

if __name__ == '__main__':
    list = []
    listdir(file_path, list)
    for li in list:
        compress_image(li, outfile_path) #压缩图片
        # break